home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / asmbler.arc / INSTALL.ASM < prev    next >
Assembly Source File  |  1988-11-19  |  7KB  |  383 lines

  1.     PAGE    55,132
  2.     TITLE    QuadScreen INSTALL - Copyright 1983 Mathews Associates
  3.  
  4.  
  5. SCRSEG    EQU    0D000H        ; HARDWARE SEGMENT FOR SCREEN
  6. ;
  7. ;
  8. VECTORS    SEGMENT    AT 0
  9.  
  10.     ORG    2*4
  11. INT2IP    DW    ?        ; Parity error / QuadScreen retrace interrupt
  12. INT2CS    DW    ?        ; vector - IP and CS
  13.  
  14.     ORG    9*4
  15. INT9IP    DW    ?        ; Keyboard interrupt
  16. INT9CS    DW    ?
  17.  
  18.     ORG    16*4
  19. INT16IP    DW    ?        ; Video I/O IP and CS
  20. INT16CS    DW    ?
  21.  
  22. VECTORS    ENDS
  23.  
  24.  
  25. DATA    SEGMENT    AT 00040H
  26.  
  27.     ORG    017H
  28. B17    DB    ?
  29. B18    DB    ?
  30.  
  31. DATA    ENDS
  32.  
  33.  
  34. QS    SEGMENT    PUBLIC 'QS'
  35.  
  36.     PUBLIC    PLAST
  37.  
  38.     EXTRN    ALTINT:FAR,LAST:NEAR,RETRACE:NEAR
  39.     EXTRN    OI16IP:WORD,OI16CS:WORD,HDWADR:WORD
  40.  
  41.  
  42.     ASSUME    CS:QS,DS:QS
  43.  
  44.     ORG    0100H
  45.  
  46. INSTALL    PROC    NEAR
  47.     XOR    AX,AX        ; Setup retrace vector
  48.     MOV    ES,AX
  49.  
  50.     ASSUME    ES:VECTORS
  51.  
  52. ; Get current Video I/O vector:
  53.     MOV    AX,INT16IP
  54.     MOV    OI16IP,AX
  55.     MOV    AX,INT16CS
  56.     MOV    OI16CS,AX
  57. ; Check if it is to SYSROM segment:
  58.     CMP    AX,0F000H
  59.     JZ    INST01        ; Yes, O.K.
  60. ; Print message & exit:
  61.     MOV    DX,OFFSET MSG01
  62.     MOV    AH,9
  63.     INT    21H        ; Print message
  64.     INT    20H        ; Exit back to DOS
  65. ;
  66. INST01:
  67.  
  68.     CLI
  69.  
  70.     MOV    AX,INT9IP
  71.     MOV    KEYBDIP,AX
  72.     MOV    AX,INT9CS
  73.     MOV    KEYBDCS,AX
  74.     MOV    AX,OFFSET RETRACE
  75.     MOV    INT2IP,AX
  76.     MOV    AX,OFFSET ALTINT
  77.     MOV    INT16IP,AX
  78.     MOV    AX,OFFSET KEYINT
  79.     MOV    INT9IP,AX
  80.     MOV    AX,CS
  81.     MOV    INT2CS,AX
  82.     MOV    INT16CS,AX
  83.     MOV    INT9CS,AX
  84.  
  85.     STI
  86.  
  87.     ASSUME    ES:NOTHING
  88.  
  89.     MOV    AH,0
  90.     MOV    AL,008H
  91.     INT    16
  92.     MOV    DX,PLAST
  93.     ADD    DX,15
  94.     MOV    CL,4
  95.     SHR    DX,CL
  96.     MOV    AH,031H
  97.     XOR    AL,AL
  98.     INT    33
  99.  
  100. PLAST    DW    LAST
  101.  
  102. MSG01:    DB    'QuadScreen has already been Installed !',13,10,'$'
  103.  
  104. INSTALL    ENDP
  105.  
  106. KBD_INT    PROC    FAR
  107. KEYINT:
  108.     STI
  109.     PUSH    AX
  110.     PUSH    DS
  111.     MOV    AX,SEG DATA
  112.     MOV    DS,AX
  113.  
  114.     ASSUME    DS:DATA
  115.  
  116. ;  IF SYSTEM RESET FROM KEYBOARD THEN RESET QUADSCREEN SCAN
  117. ;  REGISTER TO 0, DISABLE QUADSCREEN INTERRUPT AND DISABLE
  118. ;  VIDEO ON QUADSCREEN. (I.E., WRITE 0000H TO HARDWARE REGISTER
  119. ;  AT PORT 220H & 221H.)
  120. ;
  121.     IN    AL,060H
  122.     CMP    AL,83        ; CHECK FOR DEL KEY
  123.     JNZ    KYI1
  124.     TEST    B17,4        ; CHECK FOR CTRL STATE
  125.     JZ    KYI1
  126.     TEST    B17,8        ; CHECK FOR ALT STATE
  127.     JZ    KYI1
  128.     PUSH    DX
  129.     XOR    AX,AX
  130.     MOV    DX,0220H
  131.     OUT    DX,AX
  132.     POP    DX
  133. KYI1:
  134. ;  CHECK FOR ALT-PRTSC KEY. IF YES, THEN PROCESS HERE BY GIVING
  135. ;  A BIT-BY-BIT QUADSCREEN DUMP TO PRINTER.
  136. ;
  137.     CMP    AL,55        ; CHECK FOR PRTSC KEY
  138.     JNZ    KYI2
  139.     MOV    AL,B17
  140.     AND    AL,0FH
  141.     CMP    AL,8        ; CHECK IF ALT IS ONLY SHIFT STATE
  142.     JNZ    KYI2        ; IF NOT, JUMP TO PROCESS IN NORMAL WAY
  143.     PUSH    BX        ; SAVE ALL REGISTERS
  144.     PUSH    CX
  145.     PUSH    DX
  146.     PUSH    SI
  147.     PUSH    DI
  148.     PUSH    ES
  149.     IN    AL,061H        ; READ CONTROL PORT
  150.     MOV    AH,AL        ; SAVE VALUE READ
  151.     OR    AL,080H        ; RESET BIT FOR KBD
  152.     OUT    061H,AL
  153.     XCHG    AL,AH        ; GET ORIGINAL CONTROL PORT VALUE
  154.     OUT    061H,AL        ; KBD HAS BEEN RESET
  155.     CALL    QSDUMP        ; QUADSCREEN SCREEN DUMP
  156.     CLI            ; INTERRUPT RETURN SEQUENCE
  157.     MOV    AL,020H
  158.     OUT    020H,AL        ; SEND END-OF-INTERRUPT COMMAND
  159.     POP    ES
  160.     POP    DI
  161.     POP    SI
  162.     POP    DX
  163.     POP    CX
  164.     POP    BX
  165.     POP    DS
  166.     POP    AX
  167.     IRET
  168. ;
  169. KYI2:
  170.     POP    DS
  171.  
  172.     ASSUME    DS:NOTHING
  173.  
  174.     POP    AX
  175.     JMP    DWORD PTR CS:KEYBDIP
  176.  
  177. KEYBDIP    DW    ?
  178. KEYBDCS    DW    ?
  179. KBD_INT    ENDP
  180.  
  181.     ASSUME    CS:QS,DS:QS,ES:QS
  182. QSDUMP    PROC
  183.     MOV    AX,CS
  184.     MOV    DS,AX        ; INITIALIZE DATA & EXTENDED SEGMENTS
  185.     MOV    ES,AX        ;     = CODE SEGMENT
  186. ;
  187. QSD10:
  188.     MOV    BL,27        ; CHAR SEQUENCE FOR 7/72" LINE SPACING
  189.     CALL    PRTCHAR
  190.     MOV    BL,49
  191.     CALL    PRTCHAR
  192. ;
  193.     XOR    DX,DX        ; INITIALIZE ROW NO.
  194. ;
  195. QSD20:
  196.     LEA    SI,BUF
  197.     XOR    CX,CX        ; INITIALIZE COLUMN NO.
  198.     PUSH    DX        ; SAVE INITIAL ROW NO.
  199. ;
  200. QSD30:
  201.     XOR    BX,BX        ; CLEAR BYTE TO BE PRINTED
  202. ;
  203. QSD40:
  204.     SHL    BL,1
  205.     CALL    RD_DOT        ; READ A SCREEN DOT
  206.     OR    BL,AL        ; PUT IT INTO BYTE TO PRINT
  207.     INC    DX        ; ADVANCE TO NEXT ROW
  208.     MOV    AX,DX
  209.     AND    AX,7        ; CHECK IF DONE WITH 8 ROWS
  210.     JNZ    QSD40
  211. ;
  212.     MOV    [SI],BL        ; PUT BL IN PRINT-LINE BUFFER
  213.     INC    SI        ; ADVANCE TO NEXT SPOT IN BUFFER
  214.     INC    CX        ; ADVANCE TO NEXT COLUMN
  215.     CMP    CX,968        ; SEE IF LAST COLUMN
  216.     JAE    QSD50        ; JUMP WHEN FINISHED THE ROW
  217.     POP    DX        ; RESTORE INITIAL ROW NO.
  218.     PUSH    DX
  219.     JMP     QSD30        ; GO BACK TO PROCESS 8 ROWS OF NEXT COL
  220. ;
  221. QSD50:
  222.     CALL    PRT_BUF        ; PRINT LINE BUFFER
  223.     POP    DX
  224.     ADD    DX,8
  225.     CMP    DX,511        ; CHECK IF DONE WITH WHOLE SCREEN
  226.     JL     QSD20        ; CONTINUE IF NOT DONE
  227.     MOV    BL,27        ; RESET TO 1/8" LINE SPACING
  228.     CALL    PRTCHAR
  229.     MOV    BL,48
  230.     CALL    PRTCHAR
  231.     RET                ; TERMINATE PROGRAM
  232. QSDUMP    ENDP
  233. ;
  234. ;-------------------------------------------------------
  235. ;
  236. BUF    DB    968 DUP(0)    ; PRINT-LINE BUFFER
  237. BUF_END EQU    $        ; END OF BUFFER +1
  238. PRTSEL    EQU    0        ; PRINTER SELECT (CAN BE 0,1 OR 2)
  239. ;
  240. ;-------------------------------------------------------
  241. ;
  242. ;
  243. ;
  244. ;
  245. ;
  246. ;  PRINT BUFFER
  247. ;
  248. PRT_BUF    PROC
  249.     PUSH    AX        ; SAVE REGISTERS
  250.     PUSH    BX
  251.     PUSH    CX
  252.     PUSH    DX
  253.     PUSH    SI
  254.     PUSH    DI
  255. ;
  256. ;  QUADSCREEN HAS 968 PIXELS IN ONE DOT ROW BUT THE EPSON MX-80
  257. ;  HAS ONLY 960 PIXELS. THE FOLLOWING LOOP OR'S THE LAST 9 SCREEN
  258. ;  PIXELS IN THE PRINT BUFFER. WHILE THE APPEARANCE OF THIS ON 
  259. ;  THE PRINTER MAY BE QUESTIONABLE, THE ATTEMPT IS TO KEEP FROM 
  260. ;  LOSING ANY SCREEN INFORMATION.
  261. ;
  262.     LEA    DI,BUF_END
  263.     MOV    CX,9        ; CX = LOOP COUNT
  264.     XOR    BX,BX        ; INITIALIZE COMPOSITE BYTE = 0
  265. ;
  266. PB10:
  267.     DEC    DI
  268.     OR    BL,[DI]        ; OR IN NEXT BYTE
  269.     LOOP    PB10
  270.     MOV    [DI],BL        ; PUT COMPOSITE BYTE BACK AS 960th BYTE
  271.     MOV    CX,960        ; CX = NO. OF BYTES IN BUFFER TO PRINT
  272. ;  THE FOLLOWING LOOP SCANS THE PRINT-LINE BUFFER FROM END BACK
  273. ;  TO BEGINNING. THE LOOP STOPS AT THE FIRST NON-ZERO BYTE OR AT
  274. ;  THE BEGINNING OF THE BUFFER, WHICHEVER COMES FIRST. THIS IS 
  275. ;  TO STREAMLINE THE PRINT SO THAT ONLY THE MINIMUM NO. OF BYTES
  276. ;  ARE SENT TO THE PRINTER FOR EACH PRINT LINE.
  277. ;
  278. PB20:
  279.     MOV    AL,[DI]
  280.     CMP    AL,0
  281.     JNZ    PB30
  282.     DEC    DI
  283.     LOOP    PB20
  284. ;
  285. PB30:
  286.     JCXZ    PB50        ; IF ALL BYTES WERE 0, DON'T PRINT ANY
  287.     MOV    BL,27        ; CHAR SEQUENCE FOR PRINTER
  288.     CALL    PRTCHAR        ;      < DUAL-DENSITY BIT IMAGE MODE >
  289.     MOV    BL,76
  290.     CALL    PRTCHAR
  291.     MOV    BL,CL
  292.     CALL    PRTCHAR
  293.     MOV    BL,CH
  294.     CALL    PRTCHAR
  295.     XOR    SI,SI
  296. ;
  297. PB40:
  298.     MOV    BL,[SI+BUF]
  299.     CALL    PRTCHAR
  300.     INC    SI
  301.     LOOP    PB40
  302. ;
  303. PB50:
  304.     MOV    BL,10
  305.     CALL    PRTCHAR
  306.     POP    DI
  307.     POP    SI
  308.     POP    DX
  309.     POP    CX
  310.     POP    BX
  311.     POP    AX
  312.     RET
  313. PRT_BUF    ENDP
  314. ;
  315. ;
  316. ;
  317. ;
  318. ;
  319. ;  PRINT A CHAR IN BL
  320. ;
  321. ;
  322. ;
  323. PRTCHAR    PROC
  324.     PUSH    AX
  325.     PUSH    DX
  326. ;
  327. PC10:
  328.     XOR    AX,AX
  329.     MOV    AH,2
  330.     MOV    DX,PRTSEL
  331.     INT    23        ; FETCH PRINTER STATUS
  332.     TEST    AL,80H        ; CHECK IF BUSY
  333.     JNZ    PC10        ; LOOP AND WAIT TILL NOT BUSY
  334.     XOR    AH,AH
  335.     MOV    AL,BL
  336.     INT    23        ; PRINT A CHARACTER
  337.     POP    DX
  338.     POP    AX
  339.     RET
  340. PRTCHAR    ENDP
  341. ;
  342. ;
  343. ;
  344. ;  READ A SCREEN DOT
  345. ;
  346. RD_DOT    PROC
  347.     PUSH    BX
  348.     PUSH    CX
  349.     PUSH    DX
  350.     PUSH    SI
  351.     MOV    DI,CX
  352.     MOV    BX,CX
  353.     MOV    CL,3
  354.     ADD    DX,HDWADR
  355.     AND    DX,03FFH
  356.     SHL    DX,CL
  357.     ADD    DX,SCRSEG
  358.     MOV    ES,DX
  359.     SHR    DI,CL
  360.     AND    BX,7
  361.     MOV    AH,1
  362.     MOV    CL,7
  363.     SUB    CL,BL
  364.     SHL    AH,CL
  365.     XOR    AL,AL
  366.     TEST    ES:[DI],AH
  367.     JZ    RD10
  368.     INC    AL
  369. ;
  370. RD10:
  371.     POP    SI
  372.     POP    DX
  373.     POP    CX
  374.     POP    BX
  375.     RET
  376. RD_DOT    ENDP
  377. ;
  378. ;
  379. QS    ENDS
  380. ;
  381.     END    INSTALL
  382.  
  383.